"""
@-*- coding: utf-8 -*-
@ python：python 3.8
@ 创建人员：ylx
@ 创建时间：2025/4/23 下午2:14
@ 内容：描述如何对allure报告进行个性化定制，丰富报告内容
"""
"""
一.如何给allure报告更改左上角图标及文字
1.首先你需要找到你的allure 安装包的位置，cmd 可以输入 where allure 即可
2.进入allure文件夹内，config/allure.yaml文件中，新增 - custom-logo-plugin
3.返回上级进入plugins文件夹，打开custom-logo-plugin，进入static目录下，编辑styles.css文件
4.该目录下放置你需要的图标
5.代码如下：
/* 替换图片地址为你的预期地址，加！important 是为了提高样式的优先级，否则可能会以默认样式展示*/
.side-nav__brand {
  background: url('armory logo.svg') no-repeat left center !important;
  margin-left: 10px;
  height: 40px;
  background-size: contain !important;
}

/* 去掉图片后边的allure文本*/
.side-nav__brand-text{
  display: none;
}

/*设置logo后面的字体样式与字体大小*/
.side-nav__brand::after{
  content: "ARMORY";
  margin-left: 15px;
  height: 20px;
  font-family: Arial;
  font-size: 20px;
}

保存以上修改，即可个性化allure报告的标题


二：如何让你的allure报告更有层次感
在模块中使用allure 自带的注解方式来实现，必须要先导入  
import allure

在类外使用@allure.feature("说明这个模块是测试什么的，比如说测试armory其他命令模块")
在类里对于具体的case，可以在方法上使用@allure.story("描述这条case具体是干什么的，比如说，测试armory --help命令，查看帮助文档")
在类里对具体的case，使用@allure.title("你这个方法是干什么的，其实就是目的最后给你把你的方法名称，换成你这个里边写的")
在方法中使用
with allure.step("测试步骤"):
    你的这个步骤相应的代码
    
举例：
with allure.step('输入命令 armory -v 查看 armory 版本号'):
    fixture_session.execute("armory -v")
这样的相关操作可以使得你的allure报告更有层次感



@allure.feature() 定义测试用例所属的功能特性，比如可以在类方法上面使用  如系统管理
@allure.story() 定义测试用例所属的用户故事，可以在测试函数方法上使用 如 新增用户
@allure.title() 定义测试用例的标题 如 正常的新增用户
上述3个使用类似是将测试用例的执行分为了
测试用例所属模块
    测试用例用户故事
        测试用例名称

举例
    系统管理
        新增用户
            正常的新增用户
@allure.description() 定义测试用例的描述信息，出现的位置在这个测试用例具体执行后，总览中的描述
@allure.issue 和 @allure.link() 定义测试用例相关问题和链接
    一般使用@allure.issue() 括号内可以放你的缺陷管理系统，比如说测试用例执行完后这里出了问题，点击后可以直接跳转至缺陷管理系统提bug,接收url
    和name，一般比较美观，前面会有个小虫的图标，然后链接会被你提供的名字所覆盖
    一般使用@allure.link() 括号内可以放你的缺陷管理系统，比如说测试用例执行完后这里出了问题，点击后可以直接跳转至缺陷管理系统提bug
    接受3个参数，看起来就像是普通的粘贴了一个链接
    
@allure.step()定义测试用例的步骤，可以在步骤中添加日志信息
作用范围：适用于函数或方法级别。
自动执行：当被装饰的函数被调用时，Allure 会自动记录该步骤。
复用性：适合定义可复用的测试步骤（例如登录、导航等）。
动态描述：支持动态字符串参数，便于生成更具体的步骤描述


with allure.step():
是一个上下文管理器，用于在代码块中手动定义一个测试步骤
作用范围：适用于代码块级别。
手动控制：需要显式地定义步骤的开始和结束。
灵活性：适合临时定义细粒度的步骤，尤其是不能封装为函数的逻辑。
嵌套支持：可以轻松实现嵌套步骤。

从上述来看，结合使用比较好，还是跟你的需要有关，如果你的这个方法是可以被服用的，那你就可以使用装饰器级别的
如果你仅需要针对这个用例进行一些特性化的测试步骤编写，使用with allure.step()，

如果测试步骤是可复用的逻辑，优先使用 @allure.step。
如果需要临时定义细粒度步骤或嵌套步骤，使用 with allure.step()。
在复杂场景中，可以结合两者使用，使代码既简洁又灵活

@allure.step() 通过动态字符串（如 {0}、{1}）实现了对测试步骤的动态描述。
动态描述的核心是函数参数的值会被自动替换到占位符中。
结合动态描述，可以让 Allure 报告更加清晰、具体，便于分析和调试。

举例：
import allure

@allure.step("Log in with username: {0} and password: {1}")
def login(username, password):
    print(f"Logging in with {username} and {password}")


def test_login():
    login("admin", "secure_password")
    login("guest", "guest_password")
    
    






三如何标记测试用例的优先级
allure报告中使用severity_level 是一个标记测试用例重要性或优先级的属性，通过设置severity_level可以对用例进行分类
allure提供的标准如下
Blocker  阻塞问题
Critical 严重问题
Normal 一般性问题
Minor 轻微问题
Trivial 无关紧要的问题
代码中这样使用,来标记测试用例的优先级
@allure.severity(allure.severity_level.CRITICAL)


四使用api函数来实现丰富的报告
这种一般要放在方法内用

allure.attach  在报告中附加额外的信息，如文本，图片或文件
一般我们还是把这些可以往公共方法里写，那后续调用的时候，用例中使用公共方法时的一些参数记录就可以展示在测试的具体详情中
测试信息都会被补充在你具体的allure报告的具体哪个测试用例执行过程中的一些关键信息会被打印到报告中，比如说你做接口自动化
你的接口地址，接口名称 请求方式等，这些都能被详细的写到你的这个测试报告的测试步骤中体现出来
举例 allure.attach("内容-字符串类型", "标题", 类型-一般使用attachment_type=allure.attachment_type.TEXT)
会在你的body中添加一个额外的信息

allure.dynamic.link 动态生成链接

allure.dynamic.title 动态生成标题-----实现预期不再需要，通过使用装饰器@allure.title()
写死的方式来获取标题，可以灵活的通过读取yaml配置文件，结合用例来完成对测试用例标题的获取
这就要求你的工程中要以像yaml的数据驱动测试逻辑的转换，需要封装相关的yaml基础方法



使用json.dumps() 将字典可以转换成json字符串
使用json.loads() 将json字符串可以转换为python的数据类型


在一个接口测试自动化工程中，
预期allure报告应该在body中展示
接口地址
接口名称
请求方式
请求头
cookie
测试用例名称
参数类型
接口实际响应信息
断言结果，如状态码断言结果，返回值与预期值的断言结果


allure报告优化的方向 功能菜单页面 左边 测试用例的层级结构，右侧测试用例具体执行的详情



allure报告，如何增加环境变量等相关信息
1.根目录下新建 environment.xml
2.按照规定格式进行相关编写
<environment>
    <parameter>
        <key>armory client</key>
        <value>1.7.7</value>
    </parameter>
    <parameter>
        <key>python</key>
        <value>3.10.11</value>
    </parameter>
    <parameter>
        <key>allure</key>
        <value>2.7</value>
    </parameter>
</environment>
3.由于你在pytest.ini中的配置，导致你每次在运行前回去清空temp这个文件夹内上次生成的json文件
所以你不能手动的去拖拽这个文件进入这个文件夹，必须要在清空后自动的将这个文件添加进去

4.在你的all.py 全局触发入口处，在执行os.system()之前，去把这个文件复制到你的目标文件夹即可
借用python的shutil.copy("文件路径", "目标文件夹路径")即可




"""